package com.jielin.handling.util.pdfutil;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;
import com.jielin.handling.util.ConstantUtil;
import com.jielin.handling.util.DateUtil;
import com.jielin.handling.util.StringUtil;

import lombok.extern.slf4j.Slf4j;
import sun.misc.BASE64Decoder;

@Slf4j
public class PdfReportFooter extends PdfPageEventHelper {
    /**
     * 人员类型(默认0301 犯罪嫌疑人)
     */
    public String personnelType = "0301";

    /**
     * 数据库中的base64格式的签字指纹消息
     */
    public String sign = "";

    /**
     * 当时上传的base64格式的签字指纹消息
     */
    public String fileString = "";

    /**
     * 文档字体大小，页脚页眉最好和文本大小一致
     */
    public int presentFontSize = 12;

    /**
     * 文档页面大小，最好前面传入，否则默认为A4纸张
     */
    public Rectangle pageSize = PageSize.A4;

    // 模板
    public PdfTemplate total;

    // 基础字体对象
    public BaseFont bf = null;

    // 利用基础字体生成的字体对象，一般用于生成中文文字
    public Font fontDetail = null;

    /**
     * Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.
     */
    public PdfReportFooter() {

    }

    /**
     * Creates a new instance of PdfReportM1HeaderFooter 构造方法.
     *
     * @param sign            数据库中的base64格式的签字指纹消息
     * @param fileString      当时上传的base64格式的签字指纹消息
     * @param personnelType   人员类型
     * @param presentFontSize 数据体字体大小
     * @param pageSize        页面文档大小，A4，A5，A6横转翻转等Rectangle对象
     */
    public PdfReportFooter(String sign, String fileString, String personnelType, int presentFontSize,
                           Rectangle pageSize) {
        this.sign = sign;
        this.fileString = fileString;
        this.personnelType = personnelType;
        this.presentFontSize = presentFontSize;
        this.pageSize = pageSize;
    }

    public void setPersonnelType(String personnelType) {
        this.personnelType = personnelType;
    }

    public void setPresentFontSize(int presentFontSize) {
        this.presentFontSize = presentFontSize;
    }

    /**
     * TODO 文档打开时创建模板
     *
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter,
     * com.itextpdf.text.Document)
     */
    @Override
    public void onOpenDocument(PdfWriter writer, Document document) {
        total = writer.getDirectContent().createTemplate(50, 50);// 共 页 的矩形的长宽高
    }

    /**
     * TODO 关闭每页的时候，写入页眉，写入'第几页共'这几个字。
     *
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter,
     * com.itextpdf.text.Document)
     */
    @Override
    public void onEndPage(PdfWriter writer, Document document) {

        try {
            if (bf == null) {
                bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
            }
            if (fontDetail == null) {
                fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 4.拿到当前的PdfContentByte
        PdfContentByte cb = writer.getDirectContent();

        String foot = "";
        // ******判断询问 讯问
        if (StringUtil.isEmpty(personnelType)) {
//			foot = "被询问人：";
        } else if (personnelType.equals("0301") || personnelType.equals("0302")) {
            foot = "被讯问人：";
        } else if (personnelType.equals("0303") || personnelType.equals("0304")) {
            foot = "被询问人：";
        }
        Phrase footer = new Phrase(foot, fontDetail); // 打印最下面被询问人
        ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer, document.left() + 38f, document.bottom() - 25f, 0);

        String footDate = DateUtil.formatDate(new Date(), DateUtil.DATE_FORMAT_CHINESE);

        Phrase footerDate = new Phrase(footDate, fontDetail); // 打印最下面时间
        ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footerDate, document.right() - 52f,
                document.bottom() - 25f, 0);

        if (!StringUtil.isEmpty(fileString)) {// 如果有签字指纹图片信息则打印（解码Base64上传图片）
//			String truefileType = fileString.substring(fileString.indexOf("/") + 1, fileString.indexOf(";"));// 获取图片类型
            String truefileType = "png";// 获取图片类型

            String fileType = "." + truefileType;
            // 自定义的文件名称
            String trueFileName = String.valueOf(System.currentTimeMillis());
            // 设置存放图片文件的路径
            String filedocpath = ConstantUtil.SIGN_AND_FINGERPRINT_PATH;
            // 文件全路径
            String truePath = filedocpath + trueFileName + fileType;

            File newFile = new File(filedocpath);
            if (!newFile.exists()) {
                newFile.mkdirs();
            }

            // 对字节数组字符串进行Base64解码并生成图片
            // Base64解码
            BASE64Decoder decoder = new BASE64Decoder();
//			String base64String = fileString.substring(fileString.indexOf(",") + 1);// 去掉头部（不能解析）
            String base64String = fileString;// 去掉头部（不能解析）
//			log.info("Base64解码后:\n" + base64String);
            try {
                byte[] b = decoder.decodeBuffer(base64String);
                for (int i = 0; i < b.length; ++i) {
                    if (b[i] < 0) {// 调整异常数据
                        b[i] += 256;
                    }
                }
                // 生成jpeg图片
                OutputStream out = new FileOutputStream(truePath);
                out.write(b);
                out.flush();
                out.close();

                Image signimage = Image.getInstance(truePath);// 签字指纹的图片路径
                signimage.scaleToFit(200, 200);
                signimage.setAbsolutePosition(document.left() + 38f, document.bottom() - 35f);// 设置图片位置
                document.add(signimage);
            } catch (Exception e) {
                log.info("解码base64异常{}", e);
            } finally {
                // ZipUtil.deleteFile(new File(truePath));// 删除签字指纹的图片
            }
            return;
        }

        if (!StringUtil.isEmpty(sign)) {// 如果笔录详情记录中有签字指纹信息则打印（解码Base64上传图片）
            String signFileString = sign;
            String truefileType = signFileString.substring(signFileString.indexOf("/") + 1,
                    signFileString.indexOf(";"));// 获取图片类型

            String fileType = "." + truefileType;
            // 自定义的文件名称
            String trueFileName = String.valueOf(System.currentTimeMillis());
            // 设置存放图片文件的路径
            String filedocpath = ConstantUtil.SIGN_AND_FINGERPRINT_PATH;
            // 文件全路径
            String truePath = filedocpath + trueFileName + fileType;

            File newFile = new File(filedocpath);
            if (!newFile.exists()) {
                newFile.mkdirs();
            }

            // 对字节数组字符串进行Base64解码并生成图片
            // Base64解码
            BASE64Decoder decoder = new BASE64Decoder();
            String base64String = signFileString.substring(signFileString.indexOf(",") + 1);// 去掉头部（不能解析）
            log.info("Base64解码后:\n" + base64String);
            try {
                byte[] b = decoder.decodeBuffer(base64String);
                for (int i = 0; i < b.length; ++i) {
                    if (b[i] < 0) {// 调整异常数据
                        b[i] += 256;
                    }
                }
                // 生成jpeg图片
                OutputStream out = new FileOutputStream(truePath);
                out.write(b);
                out.flush();
                out.close();

                Image signimage = Image.getInstance(truePath);// 签字指纹的图片路径

                signimage.setAbsolutePosition(document.left() + 38f, document.bottom() - 35f);// 设置图片位置
                document.add(signimage);
            } catch (Exception e) {
                log.info("解码base64异常{}", e);
            } finally {
                // ZipUtil.deleteFile(new File(truePath));// 删除签字指纹的图片
            }
            return;
        }
    }

    /**
     * TODO 关闭文档时，替换模板，完成整个页眉页脚组件
     *
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter,
     * com.itextpdf.text.Document)
     */
    @Override
    public void onCloseDocument(PdfWriter writer, Document document) {
    }
}
